package model.util;

import io.netty.channel.Channel;
import io.netty.channel.group.ChannelGroup;
import view.ChatInterface;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Description 存储每个id对应的Channel和每个id对应的ChannelGroup
 * @author czc
 */
public class ChannelUtils {

    /**
     * 存放每个用户id和与之对应传输信息的channel
     */

    private static ConcurrentHashMap<String, Channel> userIdChannelMap =
            new ConcurrentHashMap<>();
    /**
     *存放每个ChannelGroup的id和与之对应的ChannelGroup
     * 每个ChannelGroup对应一个群组，每个ChatInterface也对应一个群组
     * 所有每个ChannelGroup和对应的ChatInterface的id是一样的
     */
    private static ConcurrentHashMap<String, ChannelGroup> groupIdChannelGroupMap =
            new ConcurrentHashMap<>();
    /**
     *存放每个ChatInterface的id和与之对应的聊天界面
     */
    private static ConcurrentHashMap<String, ChatInterface> chatInterfaceIdMap =
            new ConcurrentHashMap<>();

    /**
     * @Description 将用户id和与之对应的Channel存入map
     * @param userId 用户id
     * @param channel 用户与服务器通信的Channel
     */
    public static void putUserId(String userId, Channel channel) {

        userIdChannelMap.put(userId, channel);
    }

    /**
     * @Description 将ChannelGroup和对应的id存入map
     * @param channelGroupId 群组id
     * @param channels 一个群组包含多个用户通信的Channel
     */
    public static void putChannelGroupId(String channelGroupId, ChannelGroup channels) {

        groupIdChannelGroupMap.put(channelGroupId, channels);
    }

    /**
     * @Description 通过用户id获得用户与服务器传输的Channel
     * @param userId 用户id
     * @return 服务器与用户通信的Channel
     */
    public static Channel getChannel(String userId) {

        return userIdChannelMap.get(userId);
    }

    /**
     * @Description 通过群组id获得ChannelGroup
     * @param groupId 通过groupId可以获得一个ChannelGroup用于转发消息
     * @return 一个和groupId对应包含用户的ChannelGroup
     */
    public static ChannelGroup getChannelGroup(String groupId) {

        return groupIdChannelGroupMap.get(groupId);
    }

    /**
     *
     * @return 当前在线的所有用户列表
     */
    public static List<String> getAllUserId() {

        Set<String> set = userIdChannelMap.keySet();
        return new ArrayList<>(set);

    }

    /**
     *
     * @return 当前在线的总人数
     */
    public static int getUserChannelSize() {

        return userIdChannelMap.size();
    }

    /**
     * @Description 将聊天窗口和对应的id存储到map中
     * @param id 一个聊天窗口的id
     * @param chatInterface 聊天窗口
     */
    public static void putChatInterface(String id, ChatInterface chatInterface) {
        chatInterfaceIdMap.put(id, chatInterface);
    }

    /**
     * @Description 通过id得到对应的聊天窗口
     * @param id 一个窗口的id
     * @return 此id对应的窗口
     */
    public static ChatInterface getChatInterface(String id) {

        return chatInterfaceIdMap.get(id);
    }
}
